home *** CD-ROM | disk | FTP | other *** search
/ User's Choice Windows CD / User's Choice Windows CD (CMS Software)(1993).iso / windows1 / ew100.zip / FILES1.LZH / COUNTER.PAS < prev    next >
Pascal/Delphi Source File  |  1992-11-29  |  3KB  |  122 lines

  1. {************************************************}
  2. {                                                }
  3. { E! for Windows                                 }
  4. { (c) - Patrick Philippot - 1992                 }
  5. {                                                }
  6. { Sample Extension DLL                           }
  7. {                                                }
  8. { This DLL implements a simple word counter.     }
  9. { When executed it will count the number of      }
  10. { words and characters contained in the current  }
  11. { Editor and display the result in a message box.}
  12. {                                                }
  13. {************************************************}
  14.  
  15. (*
  16. To use this DLL simply load it from the user menu or add its name to the
  17. list of autoloaded Extension DLLs using the Autoload dialog box from
  18. the User Menu of EW. That's all.
  19.  
  20. This Extension DLL uses no hook. Since it attaches itself to the User Menu,
  21. you don't need to run it from the User|Execute Extension Menu. A "Word
  22. Counter" option automatically appears in the User Menu. You may also assign
  23. this extension to a keystroke. See the documentation for a description of
  24. how to assign DLL execution to a keystroke.
  25. *)
  26.  
  27. {$IFDEF DEBUG}
  28. {$A-,G+,B-,D+,F+,I-,N-,R+,S-,V-,L+}
  29. {$ELSE}
  30. {$A-,G+,B-,D-,F+,I-,N-,R-,S-,V-,L-}
  31. {$ENDIF}
  32.  
  33. library Counter;
  34.  
  35. uses WinProcs, WinTypes, EWApiImp, Strings;
  36.  
  37. const
  38.   Title : PChar = 'Word Counter';
  39.  
  40. var
  41.   SaveExit : Pointer;
  42.   EntryId  : longint;
  43.  
  44.  
  45. function Words(src : PChar) : longint;
  46.  
  47. var
  48.   Count : longint;
  49.   i,
  50.   len   : word;
  51.  
  52. const
  53.   Delimiters : set of char =
  54.     ['.', ' ', ',', ';', ':', '\', '/', '(', ')', '{', '}', '[', ']', '-'];
  55.  
  56. begin
  57.   len := StrLen(src);
  58.   if len = 0 then
  59.     Count := 0
  60.   else begin
  61.     Count := 1;
  62.     i := 0;
  63.     while (i < len) and (src[i] in Delimiters) do
  64.       Inc(i);
  65.     repeat
  66.       while (i < len) and not (src[i] in Delimiters) do
  67.         Inc(i);
  68.       while (i < len) and (src[i] in Delimiters) do
  69.         Inc(i);
  70.       if i < len then
  71.         Inc(Count);
  72.     until i >= len;
  73.   end;
  74.   Words := Count;
  75. end;
  76.  
  77. function EWExecute : integer; export;
  78.  
  79. var
  80.   index        : integer;
  81.   CharCount,
  82.   WordCount    : longint;
  83.   WordCountStr : array [0..7] of char;
  84.   CharCountStr : array [0..10] of char;
  85.   Message      : array [0..255] of char;
  86.   P            : PChar;
  87.  
  88. begin
  89.   WordCount := 0;
  90.   CharCount := 0;
  91.   for index := 0 to Pred(EWGetLineCount) do begin
  92.     P := EWGetLineAt(index);
  93.     Inc(WordCount, Words(P));
  94.     Inc(CharCount, StrLen(P));
  95.   end;
  96.   StrCopy(Message, EWGetFileName(EWGetCurrentEditor));
  97.   StrCat(Message, ' contains ');
  98.   Str(WordCount, WordCountStr);
  99.   Str(CharCount, CharCountStr);
  100.   StrCat(StrCat(StrCat(StrCat(Message, WordCountStr), ' words and '), CharCountStr), ' characters.');
  101.   MessageBox(EWGetWindowHandle, Message, Title, mb_IconInformation or mb_Ok);
  102.   EWExecute := 0;
  103. end;
  104.  
  105. procedure LibExit; far;
  106. begin
  107.  {-Remove menu item from User Menu before unloading}
  108.   EWRemoveMenuEntry(EntryId);
  109.   ExitProc := SaveExit;
  110. end;
  111.  
  112. exports
  113.   EWExecute     index 1;
  114.  
  115. begin
  116.   SaveExit := ExitProc;
  117.   ExitProc := @LibExit;
  118.  {-Extension attaches itself to the user Menu}
  119.   EntryId := EWAddMenuEntry('counter', Title, 0, EWMNU_Extension);
  120. end.
  121. 
  122.